package leetcode.editor.cn;

//给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。 
//
// 
// 如果剩余字符少于 k 个，则将剩余字符全部反转。 
// 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "abcdefg", k = 2
//输出："bacdfeg"
// 
//
// 示例 2： 
//
// 
//输入：s = "abcd", k = 2
//输出："bacd"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 10⁴ 
// s 仅由小写英文组成 
// 1 <= k <= 10⁴ 
// 
// Related Topics 双指针 字符串 👍 214 👎 0

//Java：反转字符串 II
public class ReverseStringIi_541{
    public static void main(String[] args) {
        Solution solution = new ReverseStringIi_541().new Solution();
        // TO TEST
    }
    
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String reverseStr(String s, int k) {
        if(k==1) return s;
        char[] str = s.toCharArray();
        int length=s.length(), n = length / (2 * k);
        for (int t = 0; t < n; t++) {
            for (int i = 0; i < k/2; i++) {
                char tmp = str[t*2*k+i];
                str[t*2*k+i] = str[t*2*k+k-i-1];
                str[t*2*k+k-i-1] = tmp;
            }
        }
        int rest = Math.min(length%(2*k),k);
        if(rest>0){
            for (int i = 0; i < rest/2; i++) {
                char tmp = str[n*2*k+i];
                str[n*2*k+i] = str[n*2*k+rest-i-1];
                str[n*2*k+rest-i-1] = tmp;
            }
        }
        return new String(str);
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
